package _1_singleton_pattern;

/**
 * 懒汉模式实现单例
 */
@SuppressWarnings("all")  /* Instantiation of utility class 'LazySingleton' */
public final class LazySingleton {

    /**
     * v4
     * <p>
     * 防止 JIT 对指令重排序
     */
    // private static LazySingleton instance;
    private volatile static LazySingleton instance;

    private LazySingleton() {
        // 阻止外部实例化
    }

    /**
     * v1
     * <p>
     * 单线程没有问题
     * 多线程下导致多个 LazySingleton 被实例化
     */
    public static LazySingleton getInstance1() {
        if (instance == null) {
            instance = new LazySingleton();
        }

        return instance;
    }

    /**
     * v2
     * <p>
     * 多线程下没有问题
     * 锁的范围过大、以及实例化后没有必要锁
     */
    public synchronized static LazySingleton getInstance2() {
        if (instance == null) {
            instance = new LazySingleton();
        }

        return instance;
    }

    /**
     * v3
     * <p>
     * 合理利用锁资源
     * JIT 可能会对指令进行重排序，导致类似空指针问题
     */
    public static LazySingleton getInstance3() {
        if (instance == null) {
            synchronized (LazySingleton.class) {
                if (instance == null) {
                    instance = new LazySingleton();
                }
            }
        }

        return instance;
    }

}
